package model

import (
	"ginblog/errmsg"
	"github.com/jinzhu/gorm"
)

// Article 文章模型
type Article struct {
	//表关联 根据分类来找文章 给article这个表添加物理外键CateGory
	CateGory CateGory `gorm:"foreignkey:Cid"`
	gorm.Model
	Title    string `gorm:"type:varchar(100);not null" json:"title"`
	Cid      int    `gorm:"type:int;not null" json:"cid"`
	Describe string `gorm:"type:varchar(200)" json:"describe"`
	Content  string `gorm:"type:longtext" json:"content"`
	Img      string `gorm:"type:varchar(100)" json:"img"`
}

// GetCateArt 查询分类下的所有文章
func GetCateArt(id int, pageSize int, pageNum int) ([]Article, int, int64) {
	var cateArtList []Article
	var total int64

	Err = Db.Preload("CateGory").Limit(pageSize).Offset((pageNum-1)*pageSize).Where(
		"cid =?", id).Find(&cateArtList).Count(&total).Error
	//Db.Model(&cateArtList).Where("cid =?", id).Count(&total)
	if Err != nil {
		return nil, errmsg.ERROR_CATE_NOT_EXIST, 0
	}
	return cateArtList, errmsg.SUCCESS, total
}

// GetArtInfo 查询单个文章
func GetArtInfo(id int) (Article, int) {
	var art Article
	Err = Db.Preload("CateGory").Where("id = ?", id).First(&art).Error
	//Db.Model(&art).Where("id = ?", id).UpdateColumn("read_count", gorm.Expr("read_count + ?", 1))
	if Err != nil {
		return art, errmsg.ERROR_ART_NOT_EXIST
	}
	return art, errmsg.SUCCESS
}

// GetArt 查询文章列表
func GetArt(pageSize int, pageNum int) ([]Article, int, int64) {
	var articleList []Article
	var err error
	var total int64
	err = Db.Preload("CateGory").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&articleList).Count(&total).Error
	//err = Db.Select("article.id, title, img, created_at, updated_at, `describe`, comment_count, read_count, cate_gory.name").Limit(pageSize).Offset((pageNum - 1) * pageSize).Order("Created_At DESC").Joins("Category").Find(&articleList).Error
	// 单独计数
	//Db.Model(&articleList).Count(&total)
	if err != nil {
		return nil, errmsg.ERROR, 0
	}
	return articleList, errmsg.SUCCESS, total

}

// CreateArticle 添加文章
func CreateArticle(data *Article) int {
	err := Db.Create(&data).Error
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}

// DelArticle 删除文章
func DelArticle(id int) int {
	Err = Db.Where("id=?", id).Delete(&Article{}).Error //软删除
	if Err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}

// UpdateArticle 更新文章
func UpdateArticle(id int, data *Article) int {
	var art Article
	var maps = make(map[string]interface{})
	//因为gorm中更新结构体类型数据时，这个Updates会不更新那些值为初始值，我们定义的role恰好是0和1，所以如果使用struct方法更新，则会更新失败
	//因此在这里定义了变量maps，采用map方法更新，解决role这个更新问题
	maps["title"] = data.Title
	maps["cid"] = data.Cid
	maps["describe"] = data.Describe
	maps["content"] = data.Content
	maps["img"] = data.Img

	Err = Db.Model(&art).Where("id=?", id).Updates(maps).Error
	if Err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}

// SearchArticle 搜索文章标题
func SearchArticle(title string, pageSize int, pageNum int) ([]Article, int, int64) {
	var articleList []Article
	var err error
	var total int64
	err = Db.Select("article.id,title, img, created_at, updated_at, `desc`, comment_count, read_count, Category.name").Order("Created_At DESC").Joins("Category").Where("title LIKE ?",
		title+"%",
	).Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&articleList).Error
	//单独计数
	Db.Model(&articleList).Where("title LIKE ?",
		title+"%",
	).Count(&total)

	if err != nil {
		return nil, errmsg.ERROR, 0
	}
	return articleList, errmsg.SUCCESS, total
}
